/*
 * CriadorLexicoPT.java
 *
 * Classe que representa o analisador léxico específico a ser criado.
 *
 * Última modificação: 23/06/2010
 *
 * Autores:
 *    Felipe Lacet
 *    Gutenberg Neto
 *    Jader James
 *    Marcello Galdino
 *    Ronei Oliveira
 */

package lexico;

import ConsultaURL.URLCommunication;
import java.util.ArrayList;
import persistencia.DatabaseCommunication;

public class CriadorLexicoPT {

    /*
     * Método que cria o automâto representante do analisador
     * lésico a ser criado para a primeira atividade da disciplina
     * Entradas: nada
     * Saída: autômato criado
     */

    public static AnalisadorLexico criaAutomatoLexicoPT(URLCommunication urlComunic, DatabaseCommunication dbComunic) {
        Estado estadoInicial = criaEstadosAutomatoLexicoPT();

        String alfabeto = "";
        for (char i = 'a'; i <= 'z'; i++) {
            alfabeto += i;
        }
        for (char i = 'A'; i <= 'Z'; i++) {
            alfabeto += i;
        }

        alfabeto += "âäàãáÀÂÃÄÁÊÈËÉéèëéÍÏÌÎíïìîÕÓÖÒÔõóöòôÚÛÙÜúûùüÇçÑñ";

        alfabeto += "0123456789+-:;.,!?=<>{}()_*/ \t";

        return new AnalisadorLexico(urlComunic, dbComunic, estadoInicial, alfabeto, true);
    }

    /*
     * Método que cria os estados presentes no autômato
     * lésico a ser criado para a primeira atividade da disciplina
     * Entradas: nada
     * Saída: estado inicial do autômato
     */
    private static Estado criaEstadosAutomatoLexicoPT() {
        Estado estadoInicial = new Estado("INICIO", null, false);
        Estado opAd = new Estado("OPERADOR ADITIVO", null, true);
        Estado delim1 = new Estado("DELIMITADOR", null, true);
        Estado delim2 = new Estado("DELIMITADOR", null, true);
        Estado pontFinal = new Estado("pontuacao", null, true);
        Estado pontInt = new Estado("pontuacao_intermediaria", null, true);
        Estado opAt = new Estado("COMANDO DE ATRIBUIÇÃO", null, true);
        Estado opRel1 = new Estado("OPERADOR RELACIONAL", null, true);
        Estado opRel2 = new Estado("OPERADOR RELACIONAL", null, true);
        Estado opRel3 = new Estado("OPERADOR RELACIONAL", null, true);
        Estado opRel4 = new Estado("OPERADOR RELACIONAL", null, true);
        Estado opRel5 = new Estado("OPERADOR RELACIONAL", null, true);
        Estado id = new Estado("IDENTIFICADOR", null, true);
        Estado opMult = new Estado("OPERADOR MULTIPLICATIVO", null, true);
        Estado numInt = new Estado("INTEIRO", null, true);
        Estado numReal1 = new Estado("REAL", null, true);
        Estado numReal2 = new Estado("REAL", null, true);
        Estado numReal3 = new Estado("REAL", null, true);
        Estado a = new Estado("A", null, false);
        Estado b = new Estado("B", null, false);

        // criaçao das transiçoes entre estados
        estadoInicial.addTransicao(new Transicao(delim1, "()"));
        estadoInicial.addTransicao(new Transicao(pontFinal, "!?."));
        estadoInicial.addTransicao(new Transicao(pontInt, ",;"));
        estadoInicial.addTransicao(new Transicao(delim2, ":"));
        estadoInicial.addTransicao(new Transicao(opRel1, "="));
        estadoInicial.addTransicao(new Transicao(opRel2, "<"));
        estadoInicial.addTransicao(new Transicao(opRel4, ">"));
        String aux = "";
        for (char i = 'a'; i <= 'z'; i++) {
            aux += i;
        }
        for (char i = 'A'; i <= 'Z'; i++) {
            aux += i;
        }
        aux += "âäàãáÀÂÃÄÁÊÈËÉéèëéÍÏÌÎíïìîÕÓÖÒÔõóöòôÚÛÙÜúûùüÇçÑñ";
        estadoInicial.addTransicao(new Transicao(id, aux));
        estadoInicial.addTransicao(new Transicao(opAd, "+-"));
        estadoInicial.addTransicao(new Transicao(opMult, "*/"));
        estadoInicial.addTransicao(new Transicao(numInt, "0123456789"));

        delim2.addTransicao(new Transicao(opAt, "="));
        opRel2.addTransicao(new Transicao(opRel3, "=>"));
        opRel4.addTransicao(new Transicao(opRel5, "="));
        aux += "0123456789";
        id.addTransicao(new Transicao(id, aux));
        numInt.addTransicao(new Transicao(numReal3, "."));
        numInt.addTransicao(new Transicao(numInt, "0123456789"));
        numInt.addTransicao(new Transicao(a, "e"));
        numReal3.addTransicao(new Transicao(numReal1, "0123456789"));
        numReal1.addTransicao(new Transicao(numReal1, "0123456789"));
        numReal1.addTransicao(new Transicao(a, "e"));
        a.addTransicao(new Transicao(b, "+-"));
        a.addTransicao(new Transicao(numReal2, "0123456789"));
        b.addTransicao(new Transicao(numReal2, "0123456789"));
        numReal2.addTransicao(new Transicao(numReal2, "0123456789"));

        return estadoInicial;
    }
}